<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 对象：属性和方法的集合体,组成是无序的. -->


    <script>
        // 1:字面量方式
        // let obj = {
        //     name:"tom",
        //     age : 18,
        //     showName(){
        //         console.log(this.name);
        //     }
        // };

        // 2: Object()来创建
        // let obj = new Object();
        // console.log(obj);
        // obj.name = "tom";
        // obj.age = 18;
        // obj.showName = function () {
        //     console.log(this.name);
        // }

        // obj.showName()

        // 3:工厂模式创建对象
           //  function person(a,b,c) {
           //     var o = new Object();
           //     o.a = a;
           //     o.b = b;
           //     o.c = c;
           //     o.dd = function(){
           //       console.log(this.a,this.b,this.c)
           //     }
           //     console.log(o)
           //     return o;
           //  }


           // var p1 = person(1,2,3)
           // console.log(p1.a,p1.b,p1.c)


        // 4:构造函数方式创建对象：  构造函数：构建创造对象时调用的函数   用来初始化对象
        // 概念：构造函数是一种特殊的函数，主要用来初始化对象，即为对象成员变量赋初始值，它总与 new 一起使用。我们可以把对象中一些公共的属性和方法抽取出来，然后封装到这个函数里面
        // 注意点
        // 1. 构造函数用于创建某一类对象，其首字母要大写
        // 2. 构造函数要和 new 一起使用才有意义
            // function Person(name) {
            //     //实例成员
            //     this.name = name;
            //     this.showName = function () {
            //         console.log(this.name);
            //     }
            //     return  
            // }

            // // //静态成员
            // Person.age = 18;
            // // // new 后面的函数是构造函数
            // let p1 = new Person("tom")
            // p1.showName()
            // console.log(p1.age);//undefined
            // console.log(Person.age);//18


            // 创建对象时：  new执行时候怎么做？
            // 1：在堆内存中开辟一个新的空间，即创建一个新的空的对象。
            // 2：让this指向这个新的对象
            // 3：执行构造函数里的代码，给这个新对象添加新的属性及方法
            // 4：返回这个新对象。

            // 静态成员：构造函数本身上添加属性及方法
            // 实例成员：构造函数内部的this上添加的属性及方法。


            // 对象有三个属性   prototype   contructor  __proto__
            // 在js中  每个函数都有一个prototype属性  这个属性指向这个函数的原型对象。    实例对象  原型对象  
            // 原型的概念：每一个javascript对象(除null外)创建的时候，就会与之关联另一个对象，这个对象就是我们所说的原型，每一个对象都会从原型中“继承”属性。
            // function Person(name) {
            //     this.name = name; 
            // }
            // Person.prototype.age = 20;   //Person.prototype  实例原型       Person构造函数    Person构造函数的prototype 指向Person.prototype(实例原型)
            // var p1 = new Person();
            // var p2 = new Person();
            // console.log(p1.age);
            // console.log(p2.age);


            // __proto__   每个对象(除null外)都会有的属性，叫做__proto__，这个属性会指向该对象的原型。
            // function Person() {
                
            // }

            // var person = new Person()
            // console.log(person.__proto__ === Person.prototype);

            // constructor  每个原型都有一个constructor属性  指向该关联的构造函数。
            function Person() {
                
            }

            console.log(Person === Person.prototype.constructor);

            

    </script>
</body>
</html>